home *** CD-ROM | disk | FTP | other *** search
/ IRIX 6.2 / IRIX 6.2 CD2.iso / dist / print.idb / usr / sbin / mkcentpr.z / mkcentpr
Text File  |  1996-06-10  |  9KB  |  425 lines

  1. #!/bin/sh
  2. #Tag 0x00000700
  3. #**************************************************************************
  4. #*
  5. #*           Copyright (c) 1993 Silicon Graphics, Inc.
  6. #*            All Rights Reserved
  7. #*
  8. #*       THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF SGI
  9. #*
  10. #* The copyright notice above does not evidence any actual of intended
  11. #* publication of such source code, and is an unpublished work by Silicon
  12. #* Graphics, Inc. This material contains CONFIDENTIAL INFORMATION that is
  13. #* the property of Silicon Graphics, Inc. Any use, duplication or
  14. #* disclosure not specifically authorized by Silicon Graphics is strictly
  15. #* prohibited.
  16. #*
  17. #* RESTRICTED RIGHTS LEGEND:
  18. #*
  19. #* Use, duplication or disclosure by the Government is subject to
  20. #* restrictions as set forth in subdivision (c)(1)(ii) of the Rights in
  21. #* Technical Data and Computer Software clause at DFARS 52.227-7013,
  22. #* and/or in similar or successor clauses in the FAR, DOD or NASA FAR
  23. #* Supplement. Unpublished - rights reserved under the Copyright Laws of
  24. #* the United States. Contractor is SILICON GRAPHICS, INC., 2011 N.
  25. #* Shoreline Blvd., Mountain View, CA 94039-7311
  26. #**************************************************************************
  27. #*
  28. #* File: mkcentpr
  29. #*
  30. #* $Revision: 1.29 $
  31. #*
  32. #* Description: Shell script for adding a Centronics based printer to
  33. #*    the System V spooling system.
  34. #*
  35. #*    Usage: mkcentpr
  36. #*
  37. #*    Selection of all installation parameters such as printer name
  38. #*    will be done interactively.
  39. #*
  40. #**************************************************************************
  41.  
  42.  
  43. # Well known directories and programs
  44.  
  45. LPUTIL_DIR=/usr/lib
  46. LPUTIL=$LPUTIL_DIR/lputil
  47. AWK_DIR=/usr/bin
  48. AWK=$AWK_DIR/nawk
  49. OUT_FILT="/usr/bin/pg -s -p more... -e"
  50. SPOOL_DIR=/var/spool/lp
  51. LPSTAT=/usr/bin/lpstat
  52.  
  53.  
  54. # Global variables
  55.  
  56. PNAME=""
  57. DEF_CENT_DEV=""
  58. CENT_DEV=""
  59. NUM_MODELS=0
  60. PMODEL_LIST=""
  61. PTYPE_LIST=""
  62. POPT_LIST=""
  63. TYPE_ID=""
  64. TYPE_NAME=""
  65. MODEL_NAME=""
  66. OPTION_STR=""
  67.  
  68.  
  69. #
  70. # Checks that we are the super-user and verifies
  71. # that the System V spooling system is present
  72. #
  73. CheckPermSpooler()
  74. {
  75.     cid=`/usr/bin/id | $AWK '{print substr($1,index($1,"("))}'`;
  76.     if [ "$cid" != "(root)" ]; then
  77.         echo "You must be logged in as root to use this program."
  78.         exit 1;
  79.     fi
  80.     if [ ! -r $SPOOL_DIR ]; then
  81.         echo "The System V spooling system is not installed on this system."
  82.         exit 1
  83.     fi
  84. }
  85.  
  86.  
  87. #
  88. # Determines the default parallel port based on the
  89. # system IP number.
  90. #
  91. FindDefPort()
  92. {
  93.     # Assume we have /dev/plp (e.g. PI and Indigo)
  94.     DEF_CENT_DEV=/dev/plp
  95.  
  96.     # Check for 9U VME capable machine with no plp
  97.     if hinv | egrep \
  98.       'IP4[ \n]|IP5[ \n]|IP7[ \n]|IP9[ \n]|IP15[ \n]|IP17[ \n]' \
  99.       2> /dev/null 1> /dev/null
  100.     then
  101.     DEF_CENT_DEV=/dev/cent
  102.     fi
  103. }
  104.  
  105.  
  106. #
  107. # Creates a list of Centronics printers. The list consists of model
  108. # file name, printer type and other information
  109. #
  110. CreateCentList()
  111. {
  112.     list=`$LPUTIL list | $AWK -F\% 'BEGIN { dosep = 0 }
  113.     {
  114.         if ($3 != "" &&
  115.             (length($2) == 0 ||
  116.              index($2, "CENTRONICS") ||
  117.              index($2, "VERSATEC") ||
  118.              index($2, "TEK"))) {
  119.         if (dosep)
  120.             printf("|")
  121.         else
  122.             dosep = 1
  123.         if (NF > 3)
  124.             printf("%s%%%s%%%s", $1, $3, $4)
  125.         else
  126.             printf("%s%%%s%%", $1, $3)
  127.         }
  128.     }'`
  129.     PMODEL_LIST=`echo $list | $AWK -F\% 'BEGIN { RS = "|"; dosep = 0 }
  130.     {
  131.         if (dosep)
  132.         printf(" ")
  133.         else
  134.         dosep = 1
  135.         printf("%s", $1)
  136.     }'`
  137.     PTYPE_LIST=`echo $list | $AWK -F\% 'BEGIN { RS = "|"; dosep = 0 }
  138.     {
  139.         if (dosep)
  140.         printf("|")
  141.         else
  142.         dosep = 1
  143.         printf("%s", $2)
  144.     }'`
  145.     POPT_LIST=`echo $list | $AWK -F\% 'BEGIN { RS = "|"; dosep = 0 }
  146.     {
  147.         if (dosep)
  148.         printf("|")
  149.         else
  150.         dosep = 1
  151.         printf("%s", $3)
  152.     }'`
  153.     NUM_MODELS=`echo $list | $AWK -F\% 'BEGIN { RS = "|"; count = 0 }
  154.     {
  155.         if ($1 != "")
  156.         count++
  157.     }
  158.     END { printf("%d\n", count) }'`
  159. }
  160.  
  161.  
  162. #
  163. # Displays a list of Centronics printers
  164. #
  165. ShowCentList()
  166. {
  167.     echo "Supported Centronics Printer Types:"
  168.     echo $PTYPE_LIST | $AWK -F\| 'BEGIN { RS = "|" }
  169.     {
  170.         printf("\t%2d. %s\n", NR, $1)
  171.     }' | $OUT_FILT
  172. }
  173.  
  174.  
  175. #
  176. # Extracts the model file name from the model file list
  177. # given $1 is the index into the list
  178. #
  179. GetModelFileName()
  180. {
  181.     MODEL_NAME=`echo $PMODEL_LIST | $AWK '{
  182.             printf("%s\n",$i)
  183.         }' i=$1`
  184. }
  185.  
  186.  
  187. #
  188. # Extracts the printer type from the type list
  189. # given $1 is the index into the list
  190. #
  191. GetPrinterType()
  192. {
  193.     TYPE_NAME=`echo $PTYPE_LIST | $AWK -F\| '{
  194.             printf("%s\n",$i)
  195.         }' i=$1`
  196. }
  197.  
  198.  
  199. #
  200. # Extracts the printer model file options string
  201. # from the list given $1 is the index into the list
  202. #
  203. GetPrinterOptions()
  204. {
  205.     OPTION_STR=`echo $POPT_LIST | $AWK -F\| '{
  206.             printf("%s\n",$i)
  207.         }' i=$1`
  208. }
  209.  
  210.  
  211. #
  212. # Test for pure decimal positive integer input
  213. #
  214. # Expects $1 to be the value to check. Returns 0 if
  215. # OK, 1 if invalid positive integer or if more than one
  216. # argument specified
  217. #
  218. VerifyInt()
  219. {
  220.     if [ $# -eq 0 ]; then
  221.     return 0
  222.     fi
  223.     if [ $# -gt 1 ]; then
  224.     return 1
  225.     fi
  226.     echo $1 | egrep -s '^[0-9]*$'
  227.     return $?
  228. }
  229.  
  230.  
  231. #
  232. # Test for a valid printer name (i.e. 14 chars max, A-Za-z0-9_
  233. # only and no spaces)
  234. #
  235. VerifyPname()
  236. {
  237.     if [ $# -gt 1 ]; then
  238.     return 1
  239.     fi
  240.     echo $1 | egrep -s '^[A-Za-z0-9_]*$'
  241.     if [ $? -eq 1 ]; then
  242.     return 1
  243.     fi
  244.     if [ `echo $1 | $AWK '{ print length($1) }'` -gt 14 ]; then
  245.     return 1
  246.     else
  247.     return 0
  248.     fi
  249. }
  250.  
  251.  
  252. #########################################################################
  253. #
  254. # Main program
  255. #
  256.  
  257. #
  258. # Ensure that we are root and that the main System V
  259. # spooling system directory is present
  260. #
  261. CheckPermSpooler
  262.  
  263. #
  264. # Display an intro message
  265. #
  266. echo "Centronics Printer Installation Tool\n"
  267.  
  268. #
  269. # Query user for a name for this printer
  270. #
  271. while [ "$PNAME" = "" ]; do
  272.     echo "Enter new printer name (14 chars max.): \c"
  273.     read PNAME
  274.     VerifyPname $PNAME
  275.     if [ $? -eq 1 ]; then
  276.     echo "Invalid response: Name must be 14 chars max. (A-Za-z0-9_ only)"
  277.     PNAME=""
  278.     fi
  279.     if [ "$PNAME" = "" ]; then
  280.     continue
  281.     fi
  282.     /bin/ls $SPOOL_DIR/member/$PNAME 2> /dev/null 1> /dev/null
  283.     if [ $? -eq 0 ]; then
  284.     echo ""
  285.         echo "WARNING: Printer $PNAME already exists."
  286.         echo '\nChoose a new name (y/n)[y]? \c'
  287.         read yn
  288.         if [ \( "$yn" != "n" \) -a \( "$yn" != "N" \) ]; then
  289.         PNAME=""
  290.         fi
  291.     fi
  292. done
  293. echo " "
  294.  
  295. #
  296. # Determine the default parallel port
  297. #
  298. FindDefPort
  299.  
  300. #
  301. # Query the user for the device port
  302. #
  303. while [ "$CENT_DEV" = "" ]; do
  304.     echo "Enter centronics device port [$DEF_CENT_DEV]: \c"
  305.     read CENT_DEV
  306.     if [ "$CENT_DEV" = "" ]; then
  307.     CENT_DEV=$DEF_CENT_DEV
  308.     fi
  309. done
  310. echo " "
  311.  
  312. #
  313. # Sanity check the device port by seeing if we can ls it
  314. #
  315. /bin/ls $CENT_DEV 2> /dev/null 1> /dev/null
  316. if [ $? -ne 0 ]; then
  317.     echo "WARNING: Device file $CENT_DEV does not exist."
  318.     echo '\nContinue installation (y/n)[n]? \c'
  319.     read yn
  320.     if [ \( "$yn" != "y" \) -a \( "$yn" != "Y" \) ]; then
  321.     exit 1
  322.     fi
  323.     echo " "
  324. fi
  325.  
  326. #
  327. # Check to see if another printer is using this port
  328. #
  329. in_use=`cd $SPOOL_DIR/member; egrep -l $CENT_DEV * 2> /dev/null`
  330. if [ "$in_use" != "" ]; then
  331.     echo "WARNING: Device file $CENT_DEV is currently used by printer(s):"
  332.     for p in $in_use; do
  333.     echo "\t\t$p"
  334.     done
  335.     echo '\nContinue installation (y/n)[n]? \c'
  336.     read yn
  337.     if [ \( "$yn" != "y" \) -a \( "$yn" != "Y" \) ]; then
  338.     exit 1
  339.     fi
  340.     echo " "
  341. fi
  342.  
  343. #
  344. # Look for supported Centronics printer types and display what
  345. # we find
  346. #
  347. echo "Determining supported Centronics printer types..."
  348. echo " "
  349. CreateCentList
  350. if [ $NUM_MODELS -eq 0 ]; then
  351.     echo "ERROR: No Centronics printers appear to be supported on this system."
  352.     echo "       Check that Centronics printer software has been installed."
  353.     exit 1
  354. else
  355.     ShowCentList
  356. fi
  357. echo " "
  358.  
  359. #
  360. # Query user for printer type to install
  361. #
  362. while [ "$TYPE_ID" = "" ]; do
  363.     echo "Enter printer type number: \c"
  364.     read TYPE_ID
  365.     VerifyInt $TYPE_ID
  366.     if [ $? -eq 1 ]; then
  367.         echo "Invalid response: Type must be number between 1 and $NUM_MODELS"
  368.         TYPE_ID=""
  369.     fi
  370.     if [ "$TYPE_ID" = "" ]; then
  371.     continue
  372.     fi
  373.     if [ \( $TYPE_ID -eq 0 \) -o \( $TYPE_ID -gt $NUM_MODELS \) ]; then
  374.         echo "Invalid response: Type must be between 1 and $NUM_MODELS"
  375.         TYPE_ID=""
  376.     fi
  377. done
  378.  
  379. #
  380. # Inform the user of what comes next
  381. #
  382. echo " "
  383. echo "Installing Centronics printer $PNAME..."
  384. echo " "
  385.  
  386. #
  387. # Given the type ID we can extract the model file name from the
  388. # model list, the type from the type list and the options from the
  389. # options list
  390. #
  391. GetModelFileName $TYPE_ID
  392. GetPrinterType $TYPE_ID
  393. GetPrinterOptions $TYPE_ID
  394.  
  395. #
  396. # Install the printer. We use awk to execute the lputil command
  397. # because we want the OPTION_STR strings handled properly (i.e.
  398. # with the proper quoting).
  399. #
  400. echo $LPUTIL add $CENT_DEV $MODEL_NAME \
  401.     $PNAME NAME=\'\"$TYPE_NAME\"\' $OPTION_STR | $AWK '{
  402.         rv = system($0)
  403.         exit rv
  404.     }'
  405. if [ $? -ne 0 ]; then
  406.     echo "ERROR: Installation of new printer failed."
  407.     echo "       $LPUTIL command failed."
  408.     exit 1
  409. fi
  410.  
  411. #
  412. # Inform the user of what has happened
  413. #
  414. echo " "
  415. echo "Centronics Printer $PNAME has been installed"
  416. echo " "
  417. echo "Here is your printing environment:"
  418. echo " "
  419. $LPSTAT -t | $OUT_FILT
  420.  
  421. #
  422. # Return a successful exit code
  423. #
  424. exit 0
  425.